package com.txt.email;

import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import java.io.File;
import java.util.Map;

@Slf4j
@Service
public class EmailService {

    @Value("${spring.mail.username}")
    private String username;

    @Autowired
    private JavaMailSender javaMailSender;

    /**
     * 发送文本邮件
     *
     * @param title       标题
     * @param text        文本
     * @param targetMails 目标邮箱
     */
    public void sendText(String title, String text, String... targetMails) {
        sendText(title, text, null, targetMails);
    }


    /**
     * 发送文本邮件
     *
     * @param title       标题
     * @param text        文本
     * @param Cc          抄送人
     * @param targetMails 目标邮箱
     */
    @SneakyThrows(Exception.class)
    public void sendText(String title, String text, String Cc, String... targetMails) {
        SimpleMailMessage message = new SimpleMailMessage();
        // 发件人邮箱地址
        message.setFrom(username);
        // 收件人邮箱地址数组(可实现批量发送)
        message.setTo(targetMails);
        // 邮箱标题
        message.setSubject(title);
        // 邮箱内容
        message.setText(text);
        if (StringUtils.isNotEmpty(Cc)) {
            // 抄送人邮箱地址
            message.setCc(Cc);
        }
        // 发送邮件
        javaMailSender.send(message);
    }


    /**
     * 发送HTML超文本邮件
     *
     * @param title       标题
     * @param html        HTML超文本
     * @param targetMails 目标邮箱
     */
    public void sendHtmlText(String title, String html, String... targetMails) {
        sendHtmlText(title, html, null, targetMails);
    }

    /**
     * 发送HTML超文本邮件
     *
     * @param title       标题
     * @param html        HTML超文本
     * @param Cc          抄送人
     * @param targetMails 目标邮箱
     */
    @SneakyThrows(MessagingException.class)
    public void sendHtmlText(String title, String html, String Cc, String... targetMails) {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeHelper = new MimeMessageHelper(message, true);
        // 发件人邮箱地址
        mimeHelper.setFrom(username);
        // 收件人邮箱地址数组(可实现批量发送)
        mimeHelper.setTo(targetMails);
        // 邮箱标题
        mimeHelper.setSubject(title);
        // 邮箱内容, true代表是html内容
        mimeHelper.setText(html, true);
        if (StringUtils.isNotEmpty(Cc)) {
            // 抄送人邮箱地址
            mimeHelper.setCc(Cc);
        }
        // 发送邮件
        javaMailSender.send(message);
    }

    /**
     * 发送携带附件文件的邮件
     *
     * @param title       标题
     * @param text        文本
     * @param fileMap     附件集合
     * @param targetMails 目标邮箱
     */
    public void sendAttachFileMail(String title, String text, Map<String, String> fileMap, String... targetMails) {
        sendAttachFileMail(title, text, null, fileMap, targetMails);
    }

    /**
     * 发送携带附件文件的邮件
     *
     * @param title       标题
     * @param text        文本
     * @param Cc          抄送人
     * @param fileMap     附件集合
     * @param targetMails 目标邮箱
     */
    @SneakyThrows(MessagingException.class)
    public void sendAttachFileMail(String title, String text, String Cc, Map<String, String> fileMap, String... targetMails) {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        // 构建一个带附件的邮件对象
        MimeMessageHelper mimeHelper = new MimeMessageHelper(mimeMessage, true);
        // 发件人邮箱地址
        mimeHelper.setFrom(username);
        // 收件人邮箱地址数组(可实现批量发送)
        mimeHelper.setTo(targetMails);
        // 邮箱标题
        mimeHelper.setSubject(title);
        // 邮箱内容
        mimeHelper.setText(text);
        for (String filename : fileMap.keySet()) {
            //第一个参数是文件名称，第二个参数是文件流
            File file = new File(fileMap.get(filename));
            if(!file.exists())  continue;
            mimeHelper.addAttachment(filename, file);
        }
        if (StringUtils.isNotEmpty(Cc)) {
            // 抄送人邮箱地址
            mimeHelper.setCc(Cc);
        }
        javaMailSender.send(mimeMessage);
    }


}

